home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
tool
/
otohime
/
src
/
lib
/
trem.asm
< prev
next >
Wrap
Assembly Source File
|
1994-11-16
|
5KB
|
205 lines
; PCM SOUND TREMOLO
;
; call from F-BASIC386
; callm address,varptr(snd.data),varptr(para),varptr(work area)
;
;
; 1990 3 Hiroshi TODA
;
; 1993 12 High C 用に改造
;
; para:mix1(main)*256,mix2(tremolo)*256,speed,start-phase
;
;
.386p
param struc
dd ?
dd ?
sndadd dd ? ; snd.data address
paradd dd ? ; para. address
wadd dd ? ; work address
param ends
work struc
;data area
mix1 dd ? ; main mix rate
mix2 dd ? ; tremolo mix rate
sp1 dd ? ; speed (90 = 10000H)
ang1 dd ? ; phase
buf1 dd ? ; buf.
buf2 dd ?
work ends
cseg segment dword public use32 'CODE'
assume cs:cseg,ds:cseg
public sndTremolo
db 'sndTremolo',10
sndTremolo proc near
push ebp
mov ebp,esp
push esi
push edi
push ebx
mov esi,[ebp].wadd ; esi <-- work area top add
mov edi,[ebp].sndadd ; edi <-- snd.data add.
mov ecx,[ebp].paradd ; ecx <-- para. add.
xor edx,edx ; edx=count
main01: mov eax,[ecx][edx*4] ; para. --> work area
mov [esi][edx*4],eax
inc edx
cmp edx,4
jb main01
mov ecx,[edi+12] ; length
cmp ecx,0
je mainE
add edi,32
main02: call red ; read
mov [esi].buf1,eax
mov eax,[esi].ang1 ; cal. sin
call sin ; eax = sin(eax)*10000H
add eax,10000H
sar eax,1
jns main03
xor eax,eax
main03: imul eax,[esi].buf1
sar eax,16
imul eax,[esi].mix2
mov [esi].buf2,eax
mov eax,[esi].buf1
imul eax,[esi].mix1
add eax,[esi].buf2
sar eax,8
js main04 ; eax --> pcm data
je main04
cmp eax,128 ; +
jb main05
mov eax,127
jmp main05
main04: mov edx,eax ; -
mov eax,128
sub eax,edx
cmp eax,256-1 ; data255はloopStopの意味があるから除外 1993 12
jb main05
mov eax,255-1 ; data255はloopStopの意味があるから除外 1993 12
main05: mov [edi],al
mov eax,[esi].sp1
add [esi].ang1,eax
inc edi
dec ecx
jne main02
mainE:
pop ebx
pop edi
pop esi
mov esp,ebp
pop ebp
ret
; READ PCM DATA [edi]--> eax(sign)
red: mov al,[edi]
and eax,0ffH
cmp eax,128
jb red01
mov edx,eax
mov eax,128
sub eax,edx
red01: ret
; SIN 10000H*sin(eax/10000H*3.14/2) --> eax(sign)
sin: push ebx
push ecx
push edx
mov edx,eax
and edx,30000H
cmp edx,10000H
je sin01
cmp edx,30000H
je sin01
jmp sin02
sin01: mov bx,ax
mov ax,0ffffH
sub ax,bx
sin02: and eax,0ffffH
call sin03
sin03: pop ecx
add ecx,sintb-sin03
push eax
shr eax,8
mov bx,cs:[ecx][eax*2]
mov cx,cs:[ecx+2][eax*2]
and ebx,0ffffH
and ecx,0ffffH
sub ecx,ebx
pop eax
and eax,0ffH
imul eax,ecx
shr eax,8
add eax,ebx
cmp edx,20000H
jb sin04
mov ebx,eax
xor eax,eax
sub eax,ebx
sin04: pop edx
pop ecx
pop ebx
ret
sintb dw 00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
dw 00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
dw 01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
dw 0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
dw 031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
dw 03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
dw 04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
dw 0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
dw 061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
dw 06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
dw 078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
dw 0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
dw 08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
dw 0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
dw 0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
dw 0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
dw 0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
dw 0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
dw 0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
dw 0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
dw 0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
dw 0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
dw 0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
dw 0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
dw 0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
dw 0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
dw 0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
dw 0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
dw 0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
dw 0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
dw 0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
dw 0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
dw 0FFFFH
sndTremolo endp
cseg ends
end